/**
 * 统一封装发送平台通知消息等
 * 总的以payload.type == 'wjf-platform-notification'字段统一全部的平台通知，再以 subType 进行细分
 */
const db=uniCloud.database();
module.exports = async function(param = {}, appId = '') {
	let pushParam = {
		// 验证token是否有效，无效则不向此设备推送消息
		// check_token: true,
		settings: {
			//-1表示不设离线，因为离线后重新打开数据统一从数据库中拉取。否则会重复
			ttl: -1
		},
		// 离线推送厂商信息配置，需要到云厂商后台申请
		channel: {
			// 华为离线推送
			"HW": "NORMAL",
			// 小米离线推送
			"XM": "high_system"
		}
	}

	pushParam = Object.assign(pushParam, param)

	// 如果是im通知消息（比如：加好友申请，用户请求加群，用户退群等），则记录到数据表uni-im-notification中
	if (param.payload.type == "wjf-platform-notification") {
		//从参数中解构出需要的变量
		let {
			title,
			content,
			payload,
			sound,
			open_url,
			path,
			user_id
		} = pushParam
		//生成推送数据
		let notificationContent = {
			title,
			content,
			payload,
			sound,
			open_url,
			path
		}
		notificationContent.is_read = false
		notificationContent.create_time = Date.now()
		let notificationData;
		// 如果接收消息的用户量不止一个，则需要插入数据表的记录为多条（数组）
		// 对应每个user，分别多个数据对象，user_id不同其他相同
		// 如果不是数组则只有一条数据
		if (Array.isArray(user_id)) {
			notificationData = user_id.map(uid => {
				return {
					user_id: uid,
					...notificationContent
				}
			})
		} else {
			notificationData = Object.assign(notificationContent, {
				user_id
			})
		}
		// 执行写入到数据库
		let uinRes = await db.collection('wjf-platform-notification').add(notificationData)
		param.payload.notificationId = uinRes.id
	}
	// 调用unipush API 完成信息发送   appId 应该可以是数组(待测试) __WJF
	let res = await uniCloud.getPushManager({
		appId
	}).sendMessage(pushParam)
	if (res.errCode) {
		if (res.errCode == "uni-push-user-invalid") {
			//可能因为用户长时间没有登录导致的cid过期而发送失败，但是此时已将离线数据写入数据库，登录后可获取。客户端不需要进入 catch
			res = {
				data: {
					"uni-push-err-res": res
				},
				errCode: 0
			}
		} else {
			console.log(res.errCode);
			throw new Error(res.errMsg)
		}
	}
	return res
}